#ifndef INDEX_MANAGER_H
#define INDEX_MANAGER_H

#include "../datamanager/Data.h"
#include "../datamanager/DataManager.h"
#include <vector>
#include <string>
/*
声明一个index变量
int index;

这个用于获得一个2048长度的int数组
buf = dm->getBpm()->getPage(dm->getFileID(), pageid, index);

这个用于标记修改过的页码
让对应页码被修改后能写入文件保存
注意不是pageid而是在getPage时得到的index
在确认修改了的情况下标记
否则会浪费时间写入文件
dm->getBpm()->markDirty(index);
*/

class DataManager;

class IndexManager{
public:
    IndexManager(){}
    ~IndexManager(){}
private:
    DataManager *dm;
    position curPos;
public:
    static int indexHash(std::string data){
        //在这里修改index的哈希值
        int hash_value = 0;
        const int MAX_HASH = 12345679;
        bool isNum = true;
        for(int j = 0; j < data.length(); ++j){
            if(data[j] != char(0) && (data[j] < '0' || data[j] > '9')){
                isNum = false;
                break;
            }
        }
        if(isNum){
            for(int j = 0; j < data.length(); ++j){
                if(data[j] == char(0)) break;
                hash_value = (hash_value * 10 + (data[j] - '0')) % MAX_HASH;
            }
        }
        else{
            for(int j = 0; j < data.length(); ++j){
                hash_value = (hash_value * 128 + (int)((unsigned char)data[j])) % MAX_HASH;
            }
        }
        return hash_value;
    }
public:
    void setDataManager(DataManager* dm){ this->dm = dm;}
    void setCurrentPosition(position pos){ this->curPos = pos;}
    position getCurrentPosition(){ return curPos;}
    //返回的position中first为页数，second为数组下标，注意该数据的可用范围是buf[second]~buf[second+INDEX_PER_LEN-1]
    position getNewPosition();
    //TODO:实现相关接口add,delete,search
	bool addNode(int key, int value, int pageid);
	bool deleteNode(int key, int value, int pageid);
	std::vector<int> searchKey(int key,int pageid);
};

#endif // INDEX_MANAGER_H
